﻿Imports Microsoft.DirectX
Imports Microsoft.DirectX.Direct3D
Public Class AnimationBesetzung
    Inherits ObjektAnimation
    Const FrameStart As Integer = 14
    Const FrameBesetzt As Integer = 25
    Dim FrameEnde As Integer = 29

    Dim EinBesetzungspunnktHöhe As Single = 3.3#
    Dim GebäudeTextur As Texture
    Dim GebäudeTextur2 As Texture
    Dim Infi As Texture
    Dim BesAlt As Integer = 20
    Dim BesNeu As Integer = 20
    Dim Änderung As Integer = 0
    Dim Frame2 As Integer
    Dim Besetzt As Boolean = False
    Dim StartY As Integer = 0
    Public Sub New(ByVal X As Integer, ByVal Y As Integer, ByVal Musikspielen As Boolean, ByVal Schlacht As Integer)
        MyBase.New(False, Schlacht)
        BildID = MyBase.LoadTextur("Besetzungshintergrund", 0)
       
        MyBase.P = New PointF(CSng(X), Y - 1)
        Dim Einheit As ObjektEinheit = Objektverwalter.Spielfeld.Einheiten(X, Y, ObjektSpielfeld.Bodenschlacht)
        If Einheit Is Nothing Then
            Einheit = Objektverwalter.Spielfeld.AktuelleEinheit
        End If
        Dim G As ObjektGebäude = Objektverwalter.Spielfeld.Landschaften(X, Y, ObjektSpielfeld.Bodenschlacht).Gebäude
        'Frames berechnen
        Dim E As Integer = Einheit.getKP
        If E > G.Besetzung Then
            E = G.Besetzung
        End If
        FrameEnde = 14 + 15 * (E / 10)

        If G.Angriff = ObjektGebäude.Angriffe.HQ Then
            'Das HQ ist 15 höher als andere Besetzungen.
            EinBesetzungspunnktHöhe = (66) / 20
            StartY = 15
            If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Animationen\" + G.GebäudeID + "+" + G.GetSpieler.Armee + ".png") Then
                GebäudeTextur = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Animationen\" + G.GebäudeID + "+" + G.GetSpieler.Armee + ".png"), Hauptmenü.Farbtabelleerstellen(G.GetSpieler.Farbe))
            Else
                GebäudeTextur = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Animationen\HQ+OS.png"), Hauptmenü.Farbtabelleerstellen(G.GetSpieler.Farbe))
            End If
        Else
            EinBesetzungspunnktHöhe = 66 / 20
            If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Animationen\" + G.GebäudeID + ".png") Then
                GebäudeTextur = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Animationen\" + G.GebäudeID + ".png"), Hauptmenü.Farbtabelleerstellen(G.GetSpieler.Farbe))
            Else
                GebäudeTextur = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Animationen\STADT.png"), Hauptmenü.Farbtabelleerstellen(G.GetSpieler.Farbe))
            End If
        End If
        If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Animationen\SOLDAT+" + Einheit.GetSpieler.Armee + ".png") Then
            Infi = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Animationen\SOLDAT+" + Einheit.GetSpieler.Armee + ".png"), Hauptmenü.Farbtabelleerstellen(Einheit.GetSpieler.Farbe))
        Else
            Infi = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Animationen\SOLDAT+OS.png"), Hauptmenü.Farbtabelleerstellen(Einheit.GetSpieler.Farbe))
        End If
        'wir holen die Besetzungszahl
        Dim Änderung As Integer = Einheit.getKP + Einheit.BesetzungsBonus
        Dim Bonus As Single = 0
        If Einheit.GetSpieler.KOS(0).IsInKOZone(Einheit) Then
            Bonus = Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).Besetzer
        End If

        If Not Bonus = 0 Then
            Dim Bonus2 As Single = Math.Round(Bonus)
            'Wir schaue ob Addiert oder multipliziert werden soll
            If Bonus2 = Bonus Then
                Änderung += Bonus
            Else
                Änderung *= Bonus
            End If
        End If
        Dim Bonussenkung As Integer = Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).GetBonusgebäude(X, Y)
        If Bonussenkung >= 0 Then
            Änderung -= Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).BonusGebäude(Bonussenkung).Z
            Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).KOS(0).RemoveBonusGebäude(Bonussenkung)
        End If
        'wir besetzen
        BesAlt = G.Besetzung
        If Änderung > BesAlt Then Änderung = BesAlt
        G.Besetzung = BesAlt - Änderung
        Me.Änderung = Änderung

        BesNeu = G.Besetzung
        If G.Besetzung <= 0 Then
            If G.Angriff = ObjektGebäude.Angriffe.HQ Then
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Animationen\" + G.GebäudeID + "+" + Einheit.GetSpieler.Armee + ".png") Then
                    GebäudeTextur2 = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Animationen\" + G.GebäudeID + "+" + Einheit.GetSpieler.Armee + ".png"), Hauptmenü.Farbtabelleerstellen(Einheit.GetSpieler.Farbe))
                Else
                    GebäudeTextur2 = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Animationen\HQ+OS.png"), Hauptmenü.Farbtabelleerstellen(Einheit.GetSpieler.Farbe))
                End If
            Else
                If My.Computer.FileSystem.FileExists(My.Settings.Resourcenpfad + "Animationen\" + G.GebäudeID + ".png") Then
                    GebäudeTextur2 = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Animationen\" + G.GebäudeID + ".png"), Hauptmenü.Farbtabelleerstellen(Einheit.GetSpieler.Farbe))
                Else
                    GebäudeTextur2 = Grafikengine.LoadTexture(Image.FromFile(My.Settings.Resourcenpfad + "Animationen\STADT.png"), Hauptmenü.Farbtabelleerstellen(Einheit.GetSpieler.Farbe))
                End If
            End If
            Besetzt = True
            Einheit.Besetzen = False
            G.Besetzung = ObjektGebäude.Besetzungszahl
            Select Case G.Angriff
                Case ObjektGebäude.Angriffe.Sendeturm
                    Objektverwalter.Spielfeld.Spieler(G.Spieler).Sendetürme -= 1
                    Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).Sendetürme += 1
                Case ObjektGebäude.Angriffe.Mine
                    Objektverwalter.Spielfeld.Spieler(G.Spieler).Minen -= 1
                    Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).Minen += 1
                Case ObjektGebäude.Angriffe.HQ
                    If G.Spieler > 0 Then
                        Objektverwalter.Spielfeld.Aufzeichnung.AddEreignis(G.Spieler, Objektverwalter.Spielfeld.Runde, BesonderesEreigniss.Ereignisse.HQVerlust)
                    End If
                    Objektverwalter.Spielfeld.Aufzeichnung.AddEreignis(Einheit.Spieler, Objektverwalter.Spielfeld.Runde, BesonderesEreigniss.Ereignisse.HQEroberung)
            End Select
            If G.getFonds = True Then
                Objektverwalter.Spielfeld.Spieler(G.Spieler).Geldgebäude -= 1
                Objektverwalter.Spielfeld.Spieler(Einheit.Spieler).Geldgebäude += 1
            End If
            G.Spieler = Einheit.Spieler
            G.getBildID(Nothing)
        End If
        ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenMitte)
        'Event Handling hinzufügen
        AddHandler Hauptmenü.MainMenü.MalPanel.MouseDown, AddressOf MouseDown
        AddHandler Hauptmenü.MainMenü.KeyDown, AddressOf KeyDown
    End Sub

    Public Overrides Function Malen(ByVal intColor As System.Drawing.Color, Optional ByVal Zoomfaktor As Single = 1.0) As Boolean
        MyBase.Malen(intColor, Zoomfaktor)
        Dim sngRotation As Double = 0
        Grafikengine.ptfRotCenter = New Point(41 / 2, 0)
        Grafikengine.recBild = Nothing
        If Frame2 < FrameEnde Then

            'Das Gebäude schrumpft
            Dim Frame3 As Integer = Frame2 - FrameStart
            If Frame3 < 0 Then Frame3 = 0
            If Frame3 > 10 Then Frame3 = 10

            Dim BesMom As Single = BesAlt - Frame3 * Änderung / 10

            Grafikengine.ptfPosition = New Drawing.Point(Hauptmenü.Feldbreite * P.X + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenü.Feldbreite * P.Y + Objektverwalter.Spielfeld.BildschirmKooY - 36 + (BesAlt - BesMom) * EinBesetzungspunnktHöhe + (20 - BesAlt) * EinBesetzungspunnktHöhe)
            With Grafikengine.szfScale
                .Width = 41
                .Height = 66 - (BesAlt - BesMom) * EinBesetzungspunnktHöhe - (20 - BesAlt) * EinBesetzungspunnktHöhe
            End With
            Grafikengine.Sprite.Draw2D(GebäudeTextur, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            'Der Infi wird gemalt.
            Grafikengine.ptfRotCenter = New Point(41 / 2, 0)
            If Frame2 < 10 Then
                Math.DivRem(Frame2, 6, Frame3)
                If Frame3 > 4 Then
                    Frame3 = 2
                ElseIf Frame3 > 2 Then
                    Frame3 = 1
                Else
                    Frame3 = 0
                End If
            Else
                Frame3 = 0
            End If
            Grafikengine.ptfPosition.Y -= ((BesAlt - BesMom) + (20 - BesAlt) + 4)
            With Grafikengine.recBild
                .X = Hauptmenü.FeldbreiteKlein * Frame3 : .Width = Hauptmenü.FeldbreiteKlein
                .Y = 0 : .Height = Hauptmenü.FeldbreiteKlein * 1.5#
            End With
            Grafikengine.szfScale = Nothing
            Grafikengine.ptfPosition.Y -= StartY * (BesMom / 20)
            Grafikengine.ptfPosition.X += 10
            Grafikengine.Sprite.Draw2D(Infi, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        ElseIf Besetzt = True Then
            If Frame2 = FrameEnde Then
                MusikEngine.LoadWav(My.Settings.Resourcenpfad + "Sound\Erobert.wav", False)
            End If
            Dim Frame3 As Integer = Frame2 - FrameEnde
            If Frame3 < 0 Then Frame3 = 0
            If Frame3 > 20 Then Frame3 = 20

            Dim BesMom As Single = Frame3

            Grafikengine.ptfPosition = New Drawing.Point(Hauptmenü.Feldbreite * P.X + Objektverwalter.Spielfeld.BildschirmKooX, Hauptmenü.Feldbreite * P.Y + Objektverwalter.Spielfeld.BildschirmKooY - 36 + (20 - BesMom) * EinBesetzungspunnktHöhe)
            With Grafikengine.szfScale
                .Width = 41
                .Height = BesMom * EinBesetzungspunnktHöhe
            End With
            Grafikengine.Sprite.Draw2D(GebäudeTextur2, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
            'Der Infi wird gemalt.
            Grafikengine.ptfRotCenter = New Point(41 / 2, 0)
            If Frame3 < 3 Then
                Frame3 = 3
            Else
                Frame3 = 4
            End If
            Grafikengine.ptfPosition.Y -= ((20 - BesMom) + 4)
            With Grafikengine.recBild
                .X = Hauptmenü.FeldbreiteKlein * Frame3 : .Width = Hauptmenü.FeldbreiteKlein
                .Y = 0 : .Height = Hauptmenü.FeldbreiteKlein * 1.5#
            End With
            Grafikengine.szfScale = Nothing
            Grafikengine.ptfPosition.Y -= StartY * (BesMom / 20)
            Grafikengine.ptfPosition.X += 10
            Grafikengine.Sprite.Draw2D(Infi, Grafikengine.recBild, Grafikengine.szfScale, Grafikengine.ptfRotCenter, sngRotation, Grafikengine.ptfPosition, intColor)
        End If

        Frame2 += 1
        If Besetzt Then
            If Frame2 > FrameEnde + FrameBesetzt Then
                GebäudeTextur.Dispose()
                If Not GebäudeTextur2 Is Nothing Then
                    GebäudeTextur2.Dispose()
                End If
                Infi.Dispose()
                ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenMitte)
                Objektverwalter.Spielfeld.Regeln.CheckSieg()
                Return False
            Else
                Return True
            End If
        Else
            If Frame2 > FrameEnde Then
                GebäudeTextur.Dispose()
                If Not GebäudeTextur2 Is Nothing Then
                    GebäudeTextur2.Dispose()
                End If
                Infi.Dispose()
                ObjektScript.Prüfen(ObjektScript.Prüfstadien.RundenMitte)
                Objektverwalter.Spielfeld.Regeln.CheckSieg()
                Return False
            Else
                Return True
            End If
        End If
    End Function

    Private Sub MouseDown(ByVal sender As Object, ByVal e As System.Windows.Forms.MouseEventArgs)
        Select Case e.Button
            Case MouseButtons.Right
                Frame2 = FrameEnde + FrameBesetzt + 1
        End Select
    End Sub
    Private Sub KeyDown(ByVal sender As Object, ByVal e As System.Windows.Forms.KeyEventArgs)
        Select Case e.KeyCode
            Case My.Settings.Abrechen
                Frame2 = FrameEnde + FrameBesetzt + 1
        End Select
    End Sub
    Public Overrides Sub RemoveHandles()
        MyBase.RemoveHandles()
        RemoveHandler Hauptmenü.MainMenü.MalPanel.MouseDown, AddressOf MouseDown
        RemoveHandler Hauptmenü.MainMenü.KeyDown, AddressOf KeyDown
    End Sub
End Class
